//
//  MyTool.m
//  iOSCodeLearning
//
//  Created by TFAppleWork-Summer on 2017/12/12.
//  Copyright © 2017年 Ace. All rights reserved.
//

#import "MyTool.h"

@implementation MyTool

// 1 提供一个全局的变量
static MyTool *_instance;

// 2 重写allocWithZone
+ (instancetype)allocWithZone:(struct _NSZone *)zone{
    
    //(1) 加上互斥锁 可以解决多线程安全问题
//    @synchronized(self){
//        if (_instance == nil) {
//            _instance = [super allocWithZone:zone];
//        }
//        return _instance;
//    }
    
    // (2) dispatch_once 这个方法本身就是线程安全的
    static dispatch_once_t onceToken;
    dispatch_once(&onceToken, ^{
        if (_instance == nil) {
            _instance = [super allocWithZone:zone];
        }
    });
    
    return _instance ;
}

// 3 为了让单例 方便实用，并且一眼就能看出是单例，所以给这个单例的类提供一个类方法
+ (instancetype)shareTool{
    
    return [[MyTool alloc] init];
}

//4 为了让当前这个单例更加的严谨 需要重写copyWithZone 和mutableCopyWithZone，这两个方法
/*
 这两个方法是对象方法， 所有走这个方法的时候已经拿到对象了 _instance 已经有值，所以这里直接返回就可以了
 */
- (id)copyWithZone:(NSZone *)zone{
    return _instance;
}

- (id)mutableCopyWithZone{
    return _instance;
}

@end
